// 超时处理
// 超时 对于一个连接外部资源，或者其它一些需要花费执行时间的操作的程序而言是很重要的。
// 得益于通道和 select，在 Go 中实现超时操作是简洁而优雅的。
package main

import (
	"fmt"
	"time"
)

func main() {

	c1 := make(chan string, 1)
	go func() {
		time.Sleep(time.Second * 2)
		c1 <- "result 1"
	}()

	// 我们定义了一个 1 秒超时的定义，本例中是会超时的
	select {
	case res := <-c1:
		fmt.Println(res)
	case <-time.After(time.Second * 1):
		fmt.Println("timeout 1")
	}

	c2 := make(chan string, 1)
	go func() {
		time.Sleep(time.Second * 2)
		c2 <- "result 2"
	}()

	// 我们定义了一个 3 秒超时的定义，本例中是不会超时的
	select {
	case res := <-c2:
		fmt.Println(res)
	case <-time.After(time.Second * 3):
		fmt.Println("timeout 2")
	}
}

// 使用这个 select 超时方式，需要使用通道传递结果。
// 这对于一般情况是个好的方式，因为其他重要的 Go 特性是基于通道和 select 的。
// 后面我们还会接触到两个例子：timer 和 ticker。
